package controller;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.commons.io.FilenameUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import utils.RandomNums;

@Controller
@RequestMapping("/upload")
public class UploadController {

	@RequestMapping("/goUploadImg.html")
	public String goUploadImg() {
		return "UploadImg";
	}

	/**
	 * 单文件上传 接收上传文件所使用的MultipartFile
	 */
	@RequestMapping(value = "/uploadOneImg", method = RequestMethod.POST)
	public String uploadOneImg(HttpSession session, HttpServletRequest request,
	// 上传文件所需要的接收流的参数
			@RequestParam(value = "upload", required = false) MultipartFile file) {
		// 声明文件路径名称
		String fileNameAndPath = null;
		// 判断上传文件是否非空
		if (!file.isEmpty()) {// 如果不为空
			/**
			 * 定义上传目标的路径 File.separator : 由于系统不统一,路径会有偏差, separator解决这个问题,可以做自适应
			 */
			// apache-tomcat-7.0.78\webapps\SSM\images\*.jpg
			// sparator会自适应跟目录，根据系统
			String path = session.getServletContext().getRealPath(
					"WEB-INF/images" + File.separator);
			System.out.println(path);
			// 1获取源文件名
			String oldFileName = file.getOriginalFilename();
			// 2获取源文件的后缀名
			String prefix = FilenameUtils.getExtension(oldFileName);
			// 获取源文件的容量大小
			int fileSize = 1048576;// 1mb
			System.out.println("源文件容量：" + file.getSize() + "byte");
			if (file.getSize() > fileSize) {// 容量超出了限制
				request.setAttribute("uploadError", "上传大小不得超过1Mb");
				return "UploadImg";
			} else if (// 符合图片格式
			prefix.equalsIgnoreCase("jpg") || prefix.equalsIgnoreCase("jpeg")
					|| prefix.equalsIgnoreCase("png")
					|| prefix.equalsIgnoreCase("pneg")
					|| prefix.equalsIgnoreCase("bmp")
					|| prefix.equalsIgnoreCase("gif")
					|| prefix.equalsIgnoreCase("png")) {
				// 生成随机图片名称,规则:当前系统时间 + 随机数 + _user.后缀
				// System.currentTimeMillis() : 系统时间
				// RandomUtils.nextInt(1000000) : 随机生成1 - 1000000的随机数
				String fileName = System.currentTimeMillis()
						+ RandomNums.getNums(8) + "_titleImage." + prefix;
				System.out.println("源文件名称:" + oldFileName);
				System.out.println("随机生成文件名称:" + fileName);
				// 创建File对象,以供目标文件方便读取,参数1 : 上传目标路径 参数2 : 文件名
				File targetFile = new File(path, fileName);
				// 如果文件夹路径不存在
				if (!targetFile.exists()) {
					targetFile.mkdirs();// 则创建文件夹
				}
				// 创建用户上传的文件流
				try {
					// 往目标文件流中进行上传文件,至此上传文件完成
					file.transferTo(targetFile);
					// 获取文件名称
					fileNameAndPath = path + File.separator + fileName;
					System.out.println(fileNameAndPath);
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					// 发生异常则提示
					request.setAttribute("uploadError", "上传图片失败");
					return "UploadImg";
				}
				// 成功后跳转页面
				request.setAttribute("uploadError", "上传图片成功");
				return "UploadImg";
			} else {
				request.setAttribute("uploadError", "上传图片格式不正确");
				return "UploadImg";
			}
		} else {
			request.setAttribute("uploadError", "您需要选择一张图片才能上传");
			return "UploadImg";
		}
	}

	@RequestMapping("/goUploadImgs.html")
	public String goUploadImgs() {
		return "UploadImgs";
	}

	/**
	 * 多文件上传 接收上传多文件所使用的MultipartFile
	 */
	@RequestMapping(value = "/uploadMoreImgs", method = RequestMethod.POST)
	public String uploadMoreImgs(
			HttpSession session,
			HttpServletRequest request,
			@RequestParam(value = "upload", required = false) MultipartFile[] files) {
		// 装文件名的数组
		String[] uploads = new String[files.length];
		// 错误信息提示
		String uploadError = "uploadError";
		// 定义上传目标的路径File.separator : 由于系统不统一,路径会有偏差,separator解决这个问题,可以做自适应
		String path = session.getServletContext().getRealPath("images" + File.separator);
		// 分离报错回滚
		List<File> targetFile = new ArrayList<File>();
		MultipartFile file = null;
		List<String> newFileName = new ArrayList<String>();
		// 对数组进行循环遍历
		for (int i = 0; i < files.length; i++) {
			file = files[i];
			uploadError = "uploadError";
			// 判断上传文件是否非空
			if (!file.isEmpty()) {// 如果不为空
				/**
				 * 判断当前文件是哪个文件
				 */
				switch (i) {
				case 0:
					uploadError = "ue1";
					break;
				case 1:
					uploadError = "ue2";
					break;
				case 2:
					uploadError = "ue3";
					break;
				}
				// 获取源文件名
				String oldFileName = file.getOriginalFilename();
				// 获取源文件的后缀名
				String prefix = FilenameUtils.getExtension(oldFileName);
				// 获取源文件的容量大小
				int fileSize = 1048576;// 1mb
				if (file.getSize() > fileSize) {// 容量超出了限制
					request.setAttribute(uploadError, "此上传大小不得超过1Mb");
					return "UploadImgs";
				} else if (// 符合图片格式
				prefix.equalsIgnoreCase("jpg")
						|| prefix.equalsIgnoreCase("jpeg")
						|| prefix.equalsIgnoreCase("png")
						|| prefix.equalsIgnoreCase("pneg")
						|| prefix.equalsIgnoreCase("bmp")
						|| prefix.equalsIgnoreCase("gif")
						|| prefix.equalsIgnoreCase("png")) {
					// 生成随机图片名称,规则:当前系统时间 + 随机数 + _user.后缀
					// System.currentTimeMillis() : 系统时间
					// RandomUtils.nextInt(1000000) : 随机生成1 - 1000000的随机数
					newFileName.add(System.currentTimeMillis() + RandomNums.getNums(8) + "_titleImage." + prefix);
					// 创建File对象,以供目标文件方便读取,参数1 : 上传目标路径 参数2 : 文件名
					targetFile.add(new File(path, newFileName.get(i)));
				} else {
					request.setAttribute(uploadError, "此上传图片格式不正确");
					return "UploadImgs";
				}
			} else {
				request.setAttribute(uploadError, "您必须选择所有图片才能完成上传");
				return "UploadImgs";
			}
		}
		
		for (int i = 0; i < files.length; i++) {
			file = files[i];
			switch (i) {
			case 0:
				uploadError = "ue1";
				break;
			case 1:
				uploadError = "ue2";
				break;
			case 2:
				uploadError = "ue3";
				break;
			}
			// 如果文件夹路径不存在
			if (!targetFile.get(i).exists()) {
				targetFile.get(i).mkdirs();// 则创建文件夹
			}
			// 创建用户上传的文件流
			try {
				// 往目标文件流中进行上传文件,至此上传文件完成
				System.out.println(targetFile.get(i));
				file.transferTo(targetFile.get(i));
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				// 发生异常则提示
				request.setAttribute(uploadError, "上传图片失败");
				return "UploadImgs";
			}
			switch (i) {
			case 0:
				// 获取文件名称
				uploads[i] = path + File.separator + newFileName;
				break;
			case 1:
				// 获取文件名称
				uploads[i] = path + File.separator + newFileName;
				break;
			case 2:
				// 获取文件名称
				uploads[i] = path + File.separator + newFileName;
				break;
			}
		}
		
		// 成功后跳转页面
		request.setAttribute("uploadError", "上传图片成功!");
		return "UploadImgs";
	}

	@RequestMapping("/goUploadImgsAndContext.html")
	public String goUploadImgsAndContext() {
		return "UploadImgs";
	}
	
	/**
	 * 	文件域及普通表单同时上传时处理过程
	 * 	接收上传多文件所使用的MultipartFile
	 */
	@RequestMapping(value="/uploadMoreImgsAndContext",method=RequestMethod.POST)
	public String uploadMoreImgsAndContext (
				HttpSession session ,
				HttpServletRequest request ,
				@RequestParam(value="upload",required=false) MultipartFile[] files
			) {
			
		// 装文件名的数组
			String[] uploads = new String[files.length];
			// 错误信息提示
			String uploadError = "uploadError";
			// 定义上传目标的路径File.separator : 由于系统不统一,路径会有偏差,separator解决这个问题,可以做自适应
			String path = session.getServletContext().getRealPath("images" + File.separator);
			// 分离报错回滚
			List<File> targetFile = new ArrayList<File>();
			MultipartFile file = null;
			List<String> newFileName = new ArrayList<String>();
			// 对数组进行循环遍历
			for (int i = 0; i < files.length; i++) {
				file = files[i];
				uploadError = "uploadError";
				// 判断上传文件是否非空
				if (!file.isEmpty()) {// 如果不为空
					/**
					 * 判断当前文件是哪个文件
					 */
					switch (i) {
					case 0:
						uploadError = "ue1";
						break;
					case 1:
						uploadError = "ue2";
						break;
					case 2:
						uploadError = "ue3";
						break;
					}
					// 获取源文件名
					String oldFileName = file.getOriginalFilename();
					// 获取源文件的后缀名
					String prefix = FilenameUtils.getExtension(oldFileName);
					// 获取源文件的容量大小
					int fileSize = 1048576;// 1mb
					if (file.getSize() > fileSize) {// 容量超出了限制
						request.setAttribute(uploadError, "此上传大小不得超过1Mb");
						return "UploadImgs";
					} else if (// 符合图片格式
					prefix.equalsIgnoreCase("jpg")
							|| prefix.equalsIgnoreCase("jpeg")
							|| prefix.equalsIgnoreCase("png")
							|| prefix.equalsIgnoreCase("pneg")
							|| prefix.equalsIgnoreCase("bmp")
							|| prefix.equalsIgnoreCase("gif")
							|| prefix.equalsIgnoreCase("png")) {
						// 生成随机图片名称,规则:当前系统时间 + 随机数 + _user.后缀
						// System.currentTimeMillis() : 系统时间
						// RandomUtils.nextInt(1000000) : 随机生成1 - 1000000的随机数
						newFileName.add(System.currentTimeMillis() + RandomNums.getNums(8) + "_titleImage." + prefix);
						// 创建File对象,以供目标文件方便读取,参数1 : 上传目标路径 参数2 : 文件名
						targetFile.add(new File(path, newFileName.get(i)));
					} else {
						request.setAttribute(uploadError, "此上传图片格式不正确");
						return "UploadImgs";
					}
				} else {
					request.setAttribute(uploadError, "您必须选择所有图片才能完成上传");
					return "UploadImgs";
				}
			}
			
			MultipartHttpServletRequest multRequest = (MultipartHttpServletRequest) request;
			
			String userName = multRequest.getParameter("userName");
			String content = multRequest.getParameter("content");
			
			System.out.println(userName);
			System.out.println(content);
			//传输文件
			for (int i = 0; i < files.length; i++) {
				file = files[i];
				switch (i) {
				case 0:
					uploadError = "ue1";
					break;
				case 1:
					uploadError = "ue2";
					break;
				case 2:
					uploadError = "ue3";
					break;
				}
				// 如果文件夹路径不存在
				if (!targetFile.get(i).exists()) {
					targetFile.get(i).mkdirs();// 则创建文件夹
				}
				// 创建用户上传的文件流
				try {
					// 往目标文件流中进行上传文件,至此上传文件完成
					System.out.println(targetFile.get(i));
					file.transferTo(targetFile.get(i));
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					// 发生异常则提示
					request.setAttribute(uploadError, "上传图片失败");
					return "UploadImgs";
				}
				switch (i) {
				case 0:
					// 获取文件名称
					uploads[i] = path + File.separator + newFileName;
					break;
				case 1:
					// 获取文件名称
					uploads[i] = path + File.separator + newFileName;
					break;
				case 2:
					// 获取文件名称
					uploads[i] = path + File.separator + newFileName;
					break;
				}
			}
		// 成功后跳转页面
		request.setAttribute("uploadError", "上传图片成功!");
		return "UploadImgsAndContext";
	}
}
